﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL;
using System.Web;
using System.Data;
using System.IO;
using System.Configuration;
using System.Transactions;
using System.Data.Linq;
using System.ComponentModel;
using System.Data.SqlClient;
using System.Linq.Expressions;
using UtilityExtensions;

namespace BOL
{
   public  class CajaBL
    {
       public int Add(string descripcion,
                        int idCustodio,
                        int idObra,
                        int idMoneda,
                        decimal montoAsignado)
       {

           using (TransactionScope ts = new TransactionScope())
           {

               dbGestionDataContext _db = new dbGestionDataContext(Parametros.strConnString);

               int idEmpleadoEmisor = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());

           var caja = new Caja();
           caja.setAdd(_db,
                        descripcion,
                        idCustodio,
                        idObra,
                        montoAsignado,
                        idEmpleadoEmisor,
                        idMoneda);

           _db.SubmitChanges();
          
         
           ts.Complete();
           return caja.idInternal;
           }
       }


       public int Update(int idinternal,
                        string descripcion,
                        int idCustodio,
                        decimal montoAsignado)
       {
           var caja = DbUtil.Db.Cajas.Single(p=>p.idInternal==idinternal);
           caja.descripcion=descripcion;
           caja.idCustodio=idCustodio;
           caja.montoAsignado = montoAsignado;
                        

           DbUtil.Db.SubmitChanges();
           
           return caja.idInternal;

       }
       

       int _count;

       public void Delete(int idInternal)
       {
           
           var caja = DbUtil.Db.Cajas.Single(p => p.idInternal == idInternal);


           if (caja.Rendicions.Count() > 0)
           {
               throw new Exception("Existe  Rendiciones pendientes");
           }

           DbUtil.Db.Cajas.DeleteOnSubmit(caja);
           DbUtil.Db.SubmitChanges();
       }

       public int Count(int idEmpresa,
           int idObra,
           int idProyecto,
           int startRowIndex, int maximumRows, string sortExpression)
        {
            return _count;
        }

       [DataObjectMethod(DataObjectMethodType.Select, false)]
       public List<CajaInfo> GetCajaList(int idEmpresa,
                                                        int idObra,
                                                        int idProyecto,
                                                        int startRowIndex,
                                                        int maximumRows,
                                                        string sortExpression)
       {
           // no debe cambiar el proveedor  en el mismo comparativo
           var q= from a in DbUtil.Db.Cajas
                  where  
                  (idEmpresa==0? a.Obra.Proyecto.idEmpresa!=0:a.Obra.Proyecto.idEmpresa==idEmpresa)
                  &(idProyecto==0?a.Obra.idProyecto!=0:a.Obra.idProyecto==idProyecto)
                  &(idObra==0? a.idObra!=0:a.idObra==idObra)

                       select new CajaInfo
                       {
                           CustodioStr = a.Empleado.descripcion,
                           descripcion = a.descripcion,
                           idCustodio = a.idCustodio,
                           idInternal = a.idInternal,
                           idObra = a.idObra,
                           montoAsignado = a.montoAsignado,
                           montoStr = string.Format("S/. {0:N}", a.montoAsignado),
                           ObraStr = a.Obra.descripcion,
                           idProyecto=a.Obra.idProyecto.Value,
                           monedaStr=a.Moneda.descripcion

                       };
          
           _count = q.Count();
           q = ApplySort(q, sortExpression);

           return q.Skip(startRowIndex).Take(maximumRows).ToList();


       }
       private IQueryable<CajaInfo> ApplySort(IQueryable<CajaInfo> q, string sortExpression)
       {
           switch (sortExpression)
           {
               case "CustodioStr":
                   q = q.OrderBy(b => b.CustodioStr);
                   break;
               case "CustodioStr DESC":
                   q = q.OrderByDescending(b => b.CustodioStr);
                   break;
               case "descripcion":
                   q = q.OrderBy(b => b.descripcion);
                   break;
               case "descripcion DESC":
                   q = q.OrderByDescending(b => b.descripcion);
                   break;
               case "montoAsignado":
                   q = q.OrderBy(b => b.montoAsignado);
                   break;
               case "montoAsignado DESC":
                   q = q.OrderByDescending(b => b.montoAsignado);
                   break;

               case "ObraStr":
                   q = q.OrderBy(b => b.ObraStr);
                   break;
               case "ObraStr DESC":
                   q = q.OrderByDescending(b => b.ObraStr);
                   break;


               default:
                   q = q.OrderBy(b => b.idInternal).OrderByDescending(p => p.descripcion);
                   break;
           }
           return q;
       }

      
    }
}
